package com.mgkj.service.impl;


import com.mgkj.common.result.ResultCodeEnum;
import com.mgkj.entity.Cmsmq;
import com.mgkj.exception.YiFeiException;
import com.mgkj.mapper.InitCmsmqMapper;
import com.mgkj.mapper.CommonMapper;
import com.mgkj.service.CommonService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * @author : ssy
 * @date: 2024-04-26
 * @Description:
 */
@Service
public class CommonServiceImpl implements CommonService {

    @Resource
    private CommonMapper commonMapper;

    @Resource
    private InitCmsmqMapper initCmsmqMapper;


    /**
     *
     * @param type 单别
     * @param tableName 表名
     * @return
     */
    @Override
    public String getIdByType(String type, String tableName) {
        //各系统单据设置档
        Cmsmq cmsmq = initCmsmqMapper.selectById(type);
        if(cmsmq == null) {
            throw new YiFeiException(ResultCodeEnum.PARAM_ERROR);
        }
        tableName = tableName.toUpperCase();
//        System.out.println(yearSize);
        String lastTwo = tableName.substring(tableName.length() - 2).toUpperCase();

        String string = "";
        // 单号固定为11位
        if(cmsmq.getMq004().equals("1")) {  // 日编
            string = String.format("SELECT ISNULL(CAST(CAST(MAX(%s002) AS NUMERIC(11))+1 AS CHAR(11)) ," +
                    "CONVERT(CHAR(8),GETDATE(),112)+'001') AS 单号 FROM %s WHERE %s002 " +
                    "BETWEEN CONVERT(CHAR(8),GETDATE(),112)+'001' AND CONVERT(CHAR(8),GETDATE(),112)+'999' " +
                    "AND %s001 = '%s' AND LEN(%s002) = 11", lastTwo, tableName, lastTwo, lastTwo, type, lastTwo);
        }else if(cmsmq.getMq004().equals("2")) {  // 月编
            string = String.format("SELECT ISNULL(CAST(CAST(MAX(%s002) AS NUMERIC(11))+1 AS CHAR(11)) ," +
                    "CONVERT(CHAR(6),GETDATE(),112)+'00001') AS 单号 FROM %s WHERE %s002 " +
                    "BETWEEN CONVERT(CHAR(6),GETDATE(),112)+'00001' AND CONVERT(CHAR(6),GETDATE(),112)+'99999' " +
                    "AND %s001 = '%s' AND LEN(%s002) = 11", lastTwo, tableName, lastTwo, lastTwo, type, lastTwo);
        }else if(cmsmq.getMq004().equals("3")) {
            string = String.format("SELECT ISNULL(CAST(CAST(MAX(%s002) AS NUMERIC(11))+1 AS CHAR(11)) ," +
                    "'00000000001') AS 单号 FROM %s WHERE %s002 " +
                    "BETWEEN '00000000001' AND '99999999999' " +
                    "AND %s001 = '%s' AND LEN(%s002) = 11", lastTwo, tableName, lastTwo, lastTwo, type, lastTwo);
        }else{

            throw new YiFeiException(ResultCodeEnum.PARAM_ERROR);
        }
        return commonMapper.getIdByType(string);
    }

   /**
     * 琪虎工单入库要做的特判
     * @param type 单别
     * @param tableName 表名
     * @return
     */
    @Override
    public String getIdByTypeQhMo(String type, String tableName,String insertMoDate) {
        //各系统单据设置档
        Cmsmq cmsmq = initCmsmqMapper.selectById(type);
        if(cmsmq == null) {
            throw new YiFeiException(ResultCodeEnum.PARAM_ERROR);
        }
        tableName = tableName.toUpperCase();
//        System.out.println(yearSize);
        String lastTwo = tableName.substring(tableName.length() - 2).toUpperCase();

        String string = "";

        if (insertMoDate != null && insertMoDate.length() == 8 ) {
            // 提取指定日期前缀、单号范围、默认值（复用变量，避免重复拼接）
            String datePrefix = insertMoDate;
            String startRange = datePrefix + "001";  // 日编起始单号（如20250919001）
            String endRange = datePrefix + "999";    // 日编结束单号（如20250919999）
            String defaultNo = startRange;           // 无历史数据时的默认单号

            // 根据编号规则生成SQL（全部用String.format注入变量，避免SQL语法错误）
            String mq004 = cmsmq.getMq004();
            if ("1".equals(mq004)) {  // 日编：用指定的insertMoDate作为前缀
                string = String.format(
                        // SQL逻辑：查指定日期范围内的最大单号+1，无数据则用默认单号（指定日期+001）
                        "SELECT ISNULL(CAST(CAST(MAX(%s002) AS NUMERIC(11)) + 1 AS CHAR(11)), '%s') AS 单号 " +
                                "FROM %s " +
                                "WHERE %s002 BETWEEN '%s' AND '%s' " +  // 限定：指定日期的001~999范围
                                "  AND %s001 = '%s' " +                // 过滤：指定单据类型（如type=5810）
                                "  AND LEN(%s002) = 11",               // 校验：单号必须是11位（防脏数据）
                        lastTwo,   // 1. 字段前缀 → 拼单号字段（如TF002）
                        defaultNo, // 2. 默认单号 → 如20250919001（无数据时用）
                        tableName, // 3. 表名 → 如MOCTF
                        lastTwo,   // 4. 字段前缀 → 拼单号字段（WHERE条件过滤用，如TF002）
                        startRange,// 5. 单号起始范围 → 如20250919001
                        endRange,  // 6. 单号结束范围 → 如20250919999
                        lastTwo,   // 7. 字段前缀 → 拼单据类型字段（如TF001）
                        type,      // 8. 单据类型 → 如5810
                        lastTwo    // 9. 字段前缀 → 拼单号字段（LEN校验用，如TF002）
                );

            } else if ("2".equals(mq004)) {  // 月编：用当前年月，11位=6位年月+5位序号（不受insertMoDate影响）
                string = String.format(
                        // SQL逻辑：查当前年月范围内的最大单号+1，无数据则用当前年月+00001
                        "SELECT ISNULL(CAST(CAST(MAX(%s002) AS NUMERIC(11)) + 1 AS CHAR(11)), CONVERT(CHAR(6), GETDATE(), 112) + '00001') AS 单号 " +
                                "FROM %s " +
                                "WHERE %s002 BETWEEN CONVERT(CHAR(6), GETDATE(), 112) + '00001' AND CONVERT(CHAR(6), GETDATE(), 112) + '99999' " +  // 限定：当前年月的00001~99999范围
                                "  AND %s001 = '%s' " +  // 过滤：指定单据类型
                                "  AND LEN(%s002) = 11", // 校验：单号必须是11位
                        lastTwo,   // 1. 字段前缀 → 拼单号字段（如TF002）
                        tableName, // 2. 表名 → 如MOCTF
                        lastTwo,   // 3. 字段前缀 → 拼单号字段（WHERE条件过滤用，如TF002）
                        lastTwo,   // 4. 字段前缀 → 拼单据类型字段（如TF001）
                        type,      // 5. 单据类型 → 如5810
                        lastTwo    // 6. 字段前缀 → 拼单号字段（LEN校验用，如TF002）
                );

            } else if ("3".equals(mq004)) {  // 全局编：无日期前缀，纯11位数字自增（不受insertMoDate影响）
                string = String.format(
                        // SQL逻辑：查全局范围内的最大单号+1，无数据则用00000000001
                        "SELECT ISNULL(CAST(CAST(MAX(%s002) AS NUMERIC(11)) + 1 AS CHAR(11)), '00000000001') AS 单号 " +
                                "FROM %s " +
                                "WHERE %s002 BETWEEN '00000000001' AND '99999999999' " +  // 限定：11位纯数字范围
                                "  AND %s001 = '%s' " +  // 过滤：指定单据类型
                                "  AND LEN(%s002) = 11", // 校验：单号必须是11位
                        lastTwo,   // 1. 字段前缀 → 拼单号字段（如TF002）
                        tableName, // 2. 表名 → 如MOCTF
                        lastTwo,   // 3. 字段前缀 → 拼单号字段（WHERE条件过滤用，如TF002）
                        lastTwo,   // 4. 字段前缀 → 拼单据类型字段（如TF001）
                        type,      // 5. 单据类型 → 如5810
                        lastTwo    // 6. 字段前缀 → 拼单号字段（LEN校验用，如TF002）
                );
            } else {
                // 无效的编号规则，抛错时补充具体原因（便于排查）
                throw new YiFeiException(ResultCodeEnum.PARAM_ERROR);
            }
            return commonMapper.getIdByType(string);

        }

        // 单号固定为11位
        if(cmsmq.getMq004().equals("1")) {  // 日编
            string = String.format("SELECT ISNULL(CAST(CAST(MAX(%s002) AS NUMERIC(11))+1 AS CHAR(11)) ," +
                    "CONVERT(CHAR(8),GETDATE(),112)+'001') AS 单号 FROM %s WHERE %s002 " +
                    "BETWEEN CONVERT(CHAR(8),GETDATE(),112)+'001' AND CONVERT(CHAR(8),GETDATE(),112)+'999' " +
                    "AND %s001 = '%s' AND LEN(%s002) = 11", lastTwo, tableName, lastTwo, lastTwo, type, lastTwo);
        }else if(cmsmq.getMq004().equals("2")) {  // 月编
            string = String.format("SELECT ISNULL(CAST(CAST(MAX(%s002) AS NUMERIC(11))+1 AS CHAR(11)) ," +
                    "CONVERT(CHAR(6),GETDATE(),112)+'00001') AS 单号 FROM %s WHERE %s002 " +
                    "BETWEEN CONVERT(CHAR(6),GETDATE(),112)+'00001' AND CONVERT(CHAR(6),GETDATE(),112)+'99999' " +
                    "AND %s001 = '%s' AND LEN(%s002) = 11", lastTwo, tableName, lastTwo, lastTwo, type, lastTwo);
        }else if(cmsmq.getMq004().equals("3")) {
            string = String.format("SELECT ISNULL(CAST(CAST(MAX(%s002) AS NUMERIC(11))+1 AS CHAR(11)) ," +
                    "'00000000001') AS 单号 FROM %s WHERE %s002 " +
                    "BETWEEN '00000000001' AND '99999999999' " +
                    "AND %s001 = '%s' AND LEN(%s002) = 11", lastTwo, tableName, lastTwo, lastTwo, type, lastTwo);
        }else{

            throw new YiFeiException(ResultCodeEnum.PARAM_ERROR);
        }
        return commonMapper.getIdByType(string);
    }
}
